package pe.edu.upc.e41a.javasoft.service;

import java.util.List;

import javax.persistence.TypedQuery;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.edu.upc.e41a.javasoft.domain.TipoDocumento;
import pe.edu.upc.e41a.javasoft.domain.Usuario;

@Service
@Transactional
public class UsuarioServiceImpl implements UsuarioService {

	public long countAllUsuarios() {
		return Usuario.countUsuarios();
	}

	public void deleteUsuario(Usuario usuario) {
		usuario.remove();
	}

	public Usuario findUsuario(Integer id) {
		return Usuario.findUsuario(id);
	}

	public List<Usuario> findAllUsuarios() {
		return Usuario.findAllUsuarios();
	}

	public List<Usuario> findUsuarioEntries(int firstResult, int maxResults) {
		return Usuario.findUsuarioEntries(firstResult, maxResults);
	}

	public void saveUsuario(Usuario usuario) {
		usuario.persist();
	}

	public Usuario updateUsuario(Usuario usuario) {
		return usuario.merge();
	}

	@Override
	public String insertarUsuario(Usuario usuario) {
		String mensaje = null;
		try {
			mensaje = ValidaUsuario(usuario);
			if (mensaje != "ok")
				return mensaje;
			mensaje = validaNumeroDocumento(usuario);
			if (mensaje != "ok")
				return mensaje;
			mensaje = validaCorreo(usuario);
			if (mensaje != "ok")
				return mensaje;
			mensaje = validaUser(usuario);
			if (mensaje != "ok")
				return mensaje;

			if (mensaje != "ok")
				return mensaje;
			usuario.persist();
			mensaje = "El usuario se registró exitosamente";
		} catch (Exception e) {
			// mensaje = "Error al registrar usuario";
			// return mensaje;
		}

		return mensaje;
	}

	private String ValidaUsuario(Usuario usuario) {
		String mensaje = "ok";
		if (usuario.getTipoPersona() == null) {
			mensaje = "El tipo de persona no puede ser Nulo";

		} else if (usuario.getTipoDocumento() == null) {
			mensaje = "El tipo de documento no puede ser Nulo";

		} else if (usuario.getUsuario() == null) {
			mensaje = "El nombre de usuario no puede ser Nulo";

		} else if (usuario.getApellidoPaterno() == null) {
			mensaje = "El apellido paterno de usuario no puede ser Nulo";

		} else if (usuario.getApellidoMaterno() == null) {
			mensaje = "El apellido materno de usuario no puede ser Nulo";

		} else if (usuario.getSexo() == null) {
			mensaje = "El género sexual de usuario no puede ser Nulo";

		} else if (usuario.getNumeroDocumento() == null) {
			mensaje = "El número de documento de usuario no puede ser Nulo";

		} else if (usuario.getCorreo() == null) {
			mensaje = "El nombre de correo electronico de usuario no puede ser Nulo";

		} else if (usuario.getTelefono() == null) {
			mensaje = "El número de telefono de usuario no puede ser Nulo";

		} else if (usuario.getFechaNacimiento() == null) {
			mensaje = "La fecha de nacimiento de usuario no puede ser Nulo";

		} else if (usuario.getUsuario() == null) {
			mensaje = "El nombre de usuario no puede ser Nulo";

		} else if (usuario.getClave() == null) {
			mensaje = "La clave de usuario no puede ser Nulo";

		}

		return mensaje;
	}

	private String validaNumeroDocumento(Usuario usuario) {
		String mensaje = "ok";
		if (usuario.getNumeroDocumento() != null) {
			mensaje = buscarUsuariosPorNumeroDocumentoIgual(usuario
					.getNumeroDocumento());
		}
		return mensaje;
	}

	private String validaCorreo(Usuario usuario) {
		String mensaje = "ok";
		if (usuario.getCorreo() != null) {
			mensaje = buscarUsuariosPorCorreoIgual(usuario.getCorreo());
		}
		return mensaje;
	}

	private String validaUser(Usuario usuario) {
		String mensaje = "ok";
		if (usuario.getCorreo() != null) {
			mensaje = buscarUsuariosPorUsuarioIgual(usuario.getUsuario());
		}
		return mensaje;
	}

	public List<Usuario> listarUsuario() {
		List<Usuario> listUsuarios;
		listUsuarios = Usuario.findAllUsuarios();
		return listUsuarios;
	}

	public String actualizarUsuario(Usuario usuario) {
		String mensaje = null;
		try {
			usuario.merge();
			mensaje = "El usuario se actualizo exitosamente";
		} catch (Exception e) {
			mensaje = "Error al actualizar usuario";
			return mensaje;
		}

		return mensaje;
	}

	public String buscarUsuariosPorTipoDocumentoIgual(
			TipoDocumento tipoDocumento) {
		String mensaje = null;
		try {
			TypedQuery<Usuario> usuarioResultado = Usuario
					.findUsuariosByTipoDocumento(tipoDocumento);
			if (usuarioResultado.getResultList().size() == 0) {
				mensaje = "ok";
			} else {
				mensaje = "Ya existe un usuario con este tipo de documento";
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}

	public String buscarUsuariosPorNumeroDocumentoIgual(String numeroDocumento) {

		String mensaje = null;
		try {
			TypedQuery<Usuario> usuarioResultado = Usuario
					.findUsuariosByNumeroDocumentoEquals(numeroDocumento);
			if (usuarioResultado.getResultList().size() == 0) {
				mensaje = "ok";
			} else {
				System.out.println("entro en el mensaje else");
				mensaje = "Ya existe un usuario con este número de documento";
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}

	public String buscarUsuariosPorUsuarioIgual(String usuario) {

		String mensaje = null;
		try {
			TypedQuery<Usuario> usuarioResultado = Usuario
					.findUsuariosByUsuarioEquals(usuario);
			if (usuarioResultado.getResultList().size() == 0) {
				mensaje = "ok";
			} else {
				mensaje = "Ya existe un usuario con este código";
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}

	public String buscarUsuariosPorCorreoIgual(String correo) {

		String mensaje = null;
		try {
			TypedQuery<Usuario> usuarioResultado = Usuario
					.findUsuariosByCorreoEquals(correo);
			if (usuarioResultado.getResultList().size() == 0) {
				mensaje = "ok";
			} else {
				mensaje = "Ya existe un usuario con este email";
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}

	public Usuario findUsuariosByUsuarioEquals(String usuario) {
		Usuario user = new Usuario();
		try {
			TypedQuery<Usuario> usuarioResultado = Usuario
					.findUsuariosByUsuarioEquals(usuario);
			
			user = usuarioResultado.getSingleResult();
			return user;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return user;
	}
}
